package com.outdoor.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.outdoor.model.dto.request.ApplicationRequest;
import com.outdoor.model.entity.Application;
import com.outdoor.model.enums.ApplicationStatus;

import java.util.List;

/**
 * 申请服务接口
 * 
 * @author OutdoorTeam
 * @date 2025-05-18
 */
public interface ApplicationService {

    /**
     * 创建申请
     * 
     * @param request 申请请求
     * @param userId 申请用户ID
     * @return 创建的申请
     */
    Application createApplication(ApplicationRequest request, Long userId);

    /**
     * 处理申请（批准或拒绝）
     * 
     * @param id 申请ID
     * @param status 申请状态
     * @param currentUserId 当前操作用户ID
     * @return 处理后的申请
     */
    Application processApplication(Long id, ApplicationStatus status, Long currentUserId);

    /**
     * 根据ID获取申请
     * 
     * @param id 申请ID
     * @return 申请信息
     */
    Application getApplicationById(Long id);

    /**
     * 获取用户的申请列表
     * 
     * @param userId 用户ID
     * @return 申请列表
     */
    List<Application> getApplicationsByUser(Long userId);
    
    /**
     * 分页获取用户的申请列表
     * 
     * @param userId 用户ID
     * @param page 分页对象
     * @return 申请分页列表
     */
    IPage<Application> getApplicationsByUserPage(Long userId, Page<Application> page);

    /**
     * 获取团队的申请列表
     * 
     * @param teamId 团队ID
     * @return 申请列表
     */
    List<Application> getApplicationsByTeam(Long teamId);
    
    /**
     * 分页获取团队的申请列表
     * 
     * @param teamId 团队ID
     * @param page 分页对象
     * @return 申请分页列表
     */
    IPage<Application> getApplicationsByTeamPage(Long teamId, Page<Application> page);

    /**
     * 获取团队特定状态的申请列表
     * 
     * @param teamId 团队ID
     * @param status 申请状态
     * @return 申请列表
     */
    List<Application> getApplicationsByTeamAndStatus(Long teamId, ApplicationStatus status);
    
    /**
     * 分页获取团队特定状态的申请列表
     * 
     * @param teamId 团队ID
     * @param status 申请状态
     * @param page 分页对象
     * @return 申请分页列表
     */
    IPage<Application> getApplicationsByTeamAndStatusPage(Long teamId, ApplicationStatus status, Page<Application> page);

    /**
     * 检查用户是否已申请加入团队
     * 
     * @param userId 用户ID
     * @param teamId 团队ID
     * @return 是否已申请
     */
    boolean hasApplied(Long userId, Long teamId);
    
    /**
     * 获取用户待处理的申请列表
     * 
     * @param userId 用户ID
     * @return 待处理申请列表
     */
    List<Application> getPendingApplicationsByUser(Long userId);
    
    /**
     * 分页获取用户待处理的申请列表
     * 
     * @param userId 用户ID
     * @param page 分页对象
     * @return 待处理申请分页列表
     */
    IPage<Application> getPendingApplicationsByUserPage(Long userId, Page<Application> page);
    
    /**
     * 获取用户管理的所有团队中的待处理申请列表
     * 
     * @param userId 管理员用户ID
     * @return 待处理申请列表
     */
    List<Application> getPendingApplicationsForManager(Long userId);
    
    /**
     * 分页获取用户管理的所有团队中的待处理申请列表
     * 
     * @param userId 管理员用户ID
     * @param page 分页对象
     * @return 待处理申请分页列表
     */
    IPage<Application> getPendingApplicationsForManagerPage(Long userId, Page<Application> page);
} 